﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        { //65. Шифр "Вставка в середину". Дан текст. Осуществить шифрование и дешифрование следующим образом: 
            //текст разбивается на группы из четного количества элементов, в каждой группе символы переставляются некоторым образом 
            //(например, записываются в обратном порядке) и в середину добавляются n случайных символов, далее переставляются сами группы символов.
            Program p = new Program();
            string incoming = "1234abcd56";
            int numElem = 4;
            int N = 3;

            if (incoming.Length % numElem != 0)
            {
                int i = numElem - incoming.Length % numElem;
                string s = "";
                for (int j = 0; j < i; j++)
                {
                    s = s + " ";
                }

                incoming = incoming + s;
            }
            int numGroups = incoming.Length / numElem;//3
            string[] random = p.GenerateRandomString(N, numGroups);
            string[] arr = p.SplitToGroups(incoming, numElem, numGroups);
            Array.Reverse(arr);
            string[] arrNew = p.InsertRandom(random, arr, N, numElem);
            string res = p.ShiftElenents(arrNew);

            Console.WriteLine("incoming string:  " + incoming);
            Console.WriteLine("coded string:  " + res);
            Console.WriteLine();
        }


        public string[] GenerateRandomString(int N, int numGroups)
        {
            Random random = new Random();
            string ranStr = "";
            string[] insertStr = new string[numGroups];
            for (int j = 0; j < numGroups; j++)
            {
                for (int i = 0; i < N; i++)
                {
                    char ch = (char)random.Next('a', 'z' + 1);
                    string ss = ch.ToString();
                    ranStr = ranStr + ss;

                }
                insertStr[j] = ranStr;
                ranStr = "";
            }

            return insertStr;
        }

        public string[] SplitToGroups(string incoming, int numElem, int numGroups)
        {
            string[] arr = new string[numGroups];
            int j = 0;
            for (int i = 0; i < incoming.Length; i = i + numElem)
            {
                string sub = incoming.Substring(i, numElem);

                while (j < numGroups)
                {
                    arr[j] = sub;
                    break;
                }
                j++;
            }

            return arr;
        }

        public string[] InsertRandom(string[] random, string[] arr, int N, int numElem)
        {
            string[] arrNew = new string[arr.Length];
            for (int i = 0; i < arr.Length; i++)
            {
                arrNew[i] = arr[i].Insert(numElem / 2, random[i]);
            }
            return arrNew;
        }


        public string ShiftElenents(string[] arrNew)
        {
            string res = "";
            string[] arr = new string[arrNew[0].Length];
            int i = 0;
            while (i < arrNew.Length)
            {
                for (int j = 0; j < arrNew[0].Length; j++)
                {
                    string tmp = arrNew[i];
                    arr[j] = tmp.Substring(j, 1);
                }
                Array.Reverse(arr);
                for (int m = 0; m < arr.Length; m++)
                {
                    res = res + arr[m];
                }
                i++;
            }
            return res;
        }
    }
}
